home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1991-12-14 | 26.0 KB | 852 lines |
- IMPLEMENTATION MODULE FIG ;
-
- (*
- Versuch, ein bereits fertiges FIG-File zu interpretieren
- und die Objekte zu übernehmen. Quick'n Dirty-Version.
- Verbesserungen überall möglich und nötig... (JP)
-
- Dieses Modul ist (C)'91 by Jens Pirnay
- *)
-
- FROM Dialoge IMPORT BusyStart, BusyEnd;
- FROM Diverses IMPORT GetFSelText, NumAlert, min, max;
- FROM FileIO IMPORT Fopen, EOF, AgainChar, Reset, Close,
- ReadChar, UnixLine, ReadLn, AgainLine;
- FROM ObjectUtilities IMPORT FillObject;
- FROM Types IMPORT DrawObjectTyp, TextPosTyp,
- ExtendedArraySize, CharArraySize,
- CodeAryTyp, ObjectPtrTyp;
- FROM SYSTEM IMPORT BYTE, WORD, ADDRESS , ADR ;
- FROM Storage IMPORT ALLOCATE , DEALLOCATE ;
- IMPORT CommonData ;
- IMPORT GetFile;
- IMPORT MathLib0 ;
- IMPORT MagicConvert ;
- IMPORT MagicDOS ;
- IMPORT MagicStrings ;
- IMPORT MagicSys ;
- IMPORT Variablen ;
- IMPORT mtAlerts;
- FROM VectorFont IMPORT LoadFont, TextWidth, TextHeight, SetTextStyle,
- SetFont, OutText, CreateText;
- (**
- IMPORT RTD;
- **)
-
- TYPE chset = SET OF CHAR;
- CONST
- Magic = -29564; (* Test auf ungültige Zahl *)
- FMagic = -29564.0; (* Test auf ungültige Zahl *)
- Integers = chset{'0'..'9','+','-'};
- Reals = chset{'0'..'9','+','-','.'};
-
- SolidLine = 0;
- DashLine = 1;
- DottedLine = 2;
-
- OEllipse = 1;
- TEllipseByRad = 1;
- TEllipseByDia = 2;
- TCircleByRad = 3;
- TCircleByDia = 4;
-
- OPolyline = 2;
- TPolyline = 1;
- TBox = 2;
- TPolygon = 3;
- TArcBox = 4;
-
- OSpline = 3;
- TOpenNormal = 1;
- TClosedNormal = 2;
- TOpenInterpol = 3;
- TClosedInterpol = 4;
-
- OText = 4;
- TLeftJustified = 0;
- TCenterJustified = 1;
- TRightJustified = 2;
-
- OArc = 5;
- T3PointArc = 1;
-
- OCompound = 6;
-
- OEndCompound = -6;
-
-
- VAR Filehandle : INTEGER;
-
- PROCEDURE ExtractNumber(VAR str : ARRAY OF CHAR) : INTEGER;
- VAR i, j, res : INTEGER;
- temp : ARRAY [0..19] OF CHAR;
- BEGIN
- (**
- RTD.Write('EN-In', str);
- **)
- res := Magic;
- (* Zunächst Spaces weg *)
- i := 0;
- WHILE (str[i]=' ') OR (str[i] = 07C) DO INC(i); END;
- temp := '';
- j := 0;
- WHILE str[i] IN Integers DO
- temp[j] := str[i];
- INC(i);
- INC(j);
- END;
- temp[j] := 0C;
- WHILE (str[i]=' ') OR (str[i] = 07C) DO INC(i); END;
- IF i>0 THEN
- MagicStrings.Delete(str, 0, i);
- END;
- (**
- RTD.Write('EN-temp', temp);
- **)
- IF temp[0]<>0C THEN
- res := MagicConvert.StrToInt(temp);
- END;
- (**
- RTD.Write('EN-Out', str);
- **)
- RETURN res;
- END ExtractNumber;
-
- PROCEDURE ExtractFloat(VAR str : ARRAY OF CHAR) : LONGREAL;
- VAR i, j : INTEGER;
- res : LONGREAL;
- temp : ARRAY [0..19] OF CHAR;
- BEGIN
- (**
- RTD.Write('EF-In', str);
- **)
- res := FMagic;
- (* Zunächst Spaces weg *)
- i := 0;
- WHILE (str[i]=' ') OR (str[i] = 07C) DO INC(i); END;
- temp := '';
- j := 0;
- WHILE str[i] IN Reals DO
- temp[j] := str[i];
- INC(i);
- INC(j);
- END;
- temp[j] := 0C;
- WHILE (str[i]=' ') OR (str[i] = 07C) DO INC(i); END;
- IF i>0 THEN
- MagicStrings.Delete(str, 0, i);
- END;
- (**
- RTD.Write('EF-temp', temp);
- **)
- IF temp[0]<>0C THEN
- res := MagicConvert.StrToReal(temp);
- END;
- (**
- RTD.Write('EF-Out', str);
- **)
- RETURN res;
- END ExtractFloat;
-
- PROCEDURE ParseFile(name : ARRAY OF CHAR) : BOOLEAN;
- TYPE chset = SET OF CHAR;
- VAR i : INTEGER;
- ok, first : BOOLEAN;
- upperleft : BOOLEAN;
- forwarrow : BOOLEAN;
- backwarrow : BOOLEAN;
- pixperinch : INTEGER;
- c : CHAR;
- str, num : ARRAY [0..255] OF CHAR;
- intArray : ARRAY [1..19] OF INTEGER;
- forwArray : ARRAY [1..5] OF INTEGER;
- backwArray : ARRAY [1..5] OF INTEGER;
- realArray : ARRAY [1..19] OF LONGREAL;
- charBuffer : ARRAY [0..255] OF CHAR;
- Code : CodeAryTyp;
- obj : ObjectPtrTyp;
- Surround : ARRAY [0..3] OF INTEGER;
- wx : INTEGER ;
- wy : INTEGER ;
- ww : INTEGER ;
- wh : INTEGER ;
- dum : INTEGER ;
- pos : CARDINAL;
- Version : CARDINAL;
- maxx, minx,
- maxy, miny : INTEGER;
- MinX, MinY : INTEGER;
- deltaX,
- deltaY : INTEGER;
-
- (* Allgemein gilt:
- Falls forw_arrow = 1, so folgt eine Zeile:
- %da1 %da2 %da3 %da4 %da5 (5)
- %da1 : arrow_type
- %da2 : arrow_style
- %da3 : arrow_thickness
- %da4 : arrow_width
- %da5 : arrow_height
- Falls backw_arrow = 1, ebenfalls.
- *)
-
- PROCEDURE GetLine;
- BEGIN
- str[0] := 0C;
- IF NOT EOF THEN
- ReadLn (Filehandle, str);
- END;
- END GetLine;
-
- PROCEDURE GetNewLine;
- BEGIN
- REPEAT
- GetLine;
- UNTIL str[0] <> '#';
- END GetNewLine;
-
- PROCEDURE ScanStr(Format : ARRAY OF CHAR);
- VAR i, nrint, nrreal : INTEGER;
- BEGIN
- (*
- RTD.Write('ToScan', Format);
- *)
- FOR i := 1 TO 19 DO
- intArray [i] := Magic;
- realArray[i] := FMagic;
- END;
- nrint := 0;
- nrreal := 0;
- FOR i := 0 TO MagicSys.CastToInt(MagicStrings.Length(Format))-1 DO
- IF (Format[i] = 'd') THEN
- INC(nrint);
- intArray[nrint] := ExtractNumber(str);
- END;
- IF (Format[i] = 'f') THEN
- INC(nrreal);
- realArray[nrreal] := ExtractFloat(str);
- END;
- END;
- i := nrint + nrreal;
- (*
- RTD.ShowVar('Scanned', i);
- *)
- END ScanStr;
-
- PROCEDURE Coord(integer : INTEGER) : INTEGER;
- BEGIN
- IF upperleft THEN
- RETURN -integer;
- ELSE
- RETURN integer;
- END;
- END Coord;
-
- PROCEDURE CheckArrow(forw, backw : INTEGER);
- VAR i : INTEGER;
- BEGIN
- forwarrow := intArray[forw] =1;
- backwarrow := intArray[backw]=1;
- IF forwarrow THEN
- GetNewLine;
- FOR i:=1 TO 5 DO
- forwArray[i] := ExtractNumber(str);
- END;
- END;
- IF backwarrow THEN
- GetNewLine;
- FOR i:=1 TO 5 DO
- backwArray[i] := ExtractNumber(str);
- END;
- END;
- END CheckArrow;
-
- PROCEDURE InitCode;
- VAR i : INTEGER;
- BEGIN
- FOR i := 0 TO 9 DO Code[i] := 0; END;
- FOR i := 0 TO 3 DO Surround[i] := 0; END;
- Code[8] := 1; (* Thickness *)
- END InitCode;
-
- PROCEDURE GetArc;
- VAR IsArc : BOOLEAN;
- startangle, deltaangle : INTEGER;
- radx, rady : INTEGER;
- BEGIN
- (* Format der Arc-Beschreibung:
- %d01 %d02 %d03 %d04 %d05 %d06 %d07 %f01
- %d08 %d09 %d10 %f02 %f03 %d11 %d12 %d13
- %d14 %d15 %d16 (19)
- mit
- %d01 : type %d02 : line_style
- %d03 : line_thickness %d04 : color
- %d05 : depth %d06 : pen
- %d07 : area_fill %f01 : style_val
- %d08 : direction %d09 : forw_arrow
- %d10 : backw_arrow %f02 : center_x
- %f03 : center_y %d11 : x_1
- %d12 : y_1 %d13 : x_2
- %d14 : y_2 %d15 : x_3
- %d16 : y_3
- *)
- ScanStr('dddddddfdddffdddddd');
- CheckArrow(9, 10);
- (*
- InitCode;
- Code[1] := RealCoord(realArray[2]);
- Code[2] := RealCoord(realArray[3]);
- IF (intArray[1] = T3PointArc) THEN
- IF IsArc THEN
- Code[0] := ORD(Arc);
- Code[3] := radx;
- Code[4] := startangle;
- Code[5] := deltaangle;
- Variablen.NewObject(Code, NIL, NIL, Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- ELSE
- Code[0] := ORD(Ellipse);
- Code[3] := radx;
- Code[4] := rady;
- Code[5] := startangle;
- Code[6] := deltaangle;
- Variablen.NewObject(Code, NIL, NIL, Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- END;
- END;
- *)
- END GetArc;
-
- PROCEDURE GetEllipse;
- BEGIN
- (* Format der Ellipse-Beschreibung:
- %d01 %d02 %d03 %d04 %d05 %d06 %d07 %f01
- %d08 %f02 %d09 %d10 %d11 %d12 %d13 %d14
- %d15 %d16 (18)
- mit
- %d01 : sub_type %d02 : line_style
- %d03 : line_thickness %d04 : color
- %d05 : depth %d06 : pen
- %d07 : area_fill %f01 : style_val
-
- %d08 : direction %f02 : angle
- %d09 : center_x %d10 : center_y
- %d11 : radius_x %d12 : radius_y
- %d13 : start_x %d14 : start_y
- %d15 : end_x %d16 : end_y
- *)
- ScanStr('dddddddfdfdddddddd');
- InitCode;
- Code[1] := Coord(intArray[9]);
- Code[2] := Coord(intArray[10]);
- Code[8] := 1;
- IF (intArray[1] = TCircleByRad) OR
- (intArray[1] = TCircleByDia) THEN
- Code[0] := ORD(Circle);
- Code[3] := intArray[11];
- Variablen.NewObject(Code, NIL, NIL, Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- ELSIF (intArray[1] = TEllipseByRad) OR
- (intArray[1] = TEllipseByDia) THEN
- Code[0] := ORD(Ellipse);
- Code[3] := intArray[11];
- Code[4] := intArray[12];
- Code[5] := 0;
- Code[6] := 360;
- Variablen.NewObject(Code, NIL, NIL, Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- END;
-
- END GetEllipse;
-
- PROCEDURE GetPolyline;
- VAR special : BOOLEAN; i, x, y : INTEGER;
- BEGIN
- (* Format der Polyline-Beschreibung:
- %d01 %d02 %d03 %d04 %d05 %d06 %d07 %f01
- %d08 %d09 (10) (TFX-1.4)
- bei %d01 = 4 (s.u.)
- %d08 %d09 %d10 (11) (FIG-2.0)
- mit
- %d01 : sub_type %d02 : line_style
- %d03 : line_thickness %d04 : color
- %d05 : depth %d06 : pen
- %d07 : area_fill %f01 : style_val
-
- %d08 : forw_arrow %d09 : backw_arrow (TFX-1.4)
- bzw. falls sub_type=4 (T_ARC_BOX)
- %d08 : radius %d09 : forw_arrow
- %d10 : backw_arrow
-
- Zunächst folgen eventuelle arrow-Beschreibungen (s.o), dann
- Koordinatenpaare, die vom speziellen Paar 9999 9999 abge-
- schlossen werden.
-
- *)
- InitCode;
- ScanStr('dddddddfdd');
- CASE intArray[2] OF
- DottedLine : Code[0] := ORD(EpicDottedLine); |
- DashLine : Code[0] := ORD(EpicDashedLine); |
- ELSE
- Code[0] := ORD(EpicSolidLine);
- END;
-
- IF intArray[1] = TArcBox THEN
- intArray[10] := ExtractNumber(str);
- CheckArrow(9, 10);
- special := TRUE;
- ELSE
- CheckArrow(8, 9);
- special := FALSE;
- END;
- x := Coord(9999);
- y := x;
- Code[3] := -1;
- IF forwarrow THEN INC(Code[5], 2); END;
- IF backwarrow THEN INC(Code[5], 1); END;
- REPEAT
- GetNewLine;
- WHILE (str[0]<>0C) DO
- x := Coord(ExtractNumber(str));
- y := Coord(ExtractNumber(str));
- IF (x<>Coord(9999)) OR (y<>Coord(9999)) THEN
- INC(Code[3]);
- IF Code[3] = 0 THEN
- Code[1] := x;
- Code[2] := y;
- maxx := x; minx := x; IF minx<MinX THEN MinX := minx; END;
- maxy := y; miny := y; IF miny<MinY THEN MinY := miny; END;
- ELSIF 2*(Code[3]+1)>=ExtendedArraySize-1 THEN
- (* Objekt erzeugen, anschließend auf Anfangszustand *)
- DEC(Code[3]);
- Surround[0] := minx;
- Surround[1] := maxy;
- Surround[2] := maxx - minx;
- Surround[3] := maxy - miny;
- Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
- maxx := x; minx := x; IF minx<MinX THEN MinX := minx; END;
- maxy := y; miny := y; IF miny<MinY THEN MinY := miny; END;
- Code[3] := 0;
- Code[1] := x;
- Code[2] := y;
- ELSE
- minx := min(x, minx);
- maxx := max(x, maxx);
- miny := min(y, miny);
- maxy := max(y, maxy);
- IF minx<MinX THEN MinX := minx; END;
- IF miny<MinY THEN MinY := miny; END;
- Variablen.ebuffer[2*(Code[3]-1) ] := x - Code[1];
- Variablen.ebuffer[2*(Code[3]-1)+1] := y - Code[2];
- END;
- END;
- END;
- UNTIL ((x=Coord(9999)) AND (y=Coord(9999))) OR EOF;
- IF Code[3]>0 THEN
- IF (intArray[1] = TBox) AND
- ((intArray[2] = DashLine) OR
- (intArray[2] = SolidLine)) THEN
- IF intArray[2] = DashLine THEN
- Code[0] := ORD(Dashbox);
- ELSE
- Code[0] := ORD(Framebox);
- END;
- Code[1] := minx;
- Code[2] := miny;
- Code[3] := (maxx-minx);
- Code[4] := (maxy-miny);
- ELSE
- Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- END;
- END;
- END GetPolyline;
-
- PROCEDURE GetSpline;
- VAR i, x, y : INTEGER;
- cx1, cy1 : LONGREAL;
- cx2, cy2 : LONGREAL;
- anzahl : INTEGER;
- BEGIN
- (* Format der Spline-Beschreibung:
- %d01 %d02 %d03 %d04 %d05 %d06 %d07 %f01
- %d08 %d09 (10)
- mit
- %d01 : sub_type %d02 : line_style
- %d03 : line_thickness %d04 : color
- %d05 : depth %d06 : pen
- %d07 : area_fill %f01 : style_val
-
- %d08 : forw_arrow %d09 : backw_arrow
- *)
- ScanStr('dddddddfdd');
- CheckArrow(8, 9);
- InitCode;
- CASE intArray[2] OF
- DottedLine : Code[0] := ORD(EpicDottedLine); |
- DashLine : Code[0] := ORD(EpicDashedLine); |
- ELSE
- Code[0] := ORD(EpicSolidLine);
- END;
- Code[3] := -1;
- IF forwarrow THEN INC(Code[5], 2); END;
- IF backwarrow THEN INC(Code[5], 1); END;
- REPEAT
- GetNewLine;
- WHILE (str[0]<>0C) DO
- x := Coord(ExtractNumber(str));
- y := Coord(ExtractNumber(str));
- IF (x<>Coord(9999)) OR (y<>Coord(9999)) THEN
- INC(Code[3]);
- IF Code[3] = 0 THEN
- Code[1] := x;
- Code[2] := y;
- maxx := x; minx := x;
- maxy := y; miny := y;
- IF minx<MinX THEN MinX := minx; END;
- IF miny<MinY THEN MinY := miny; END;
- ELSIF 2*(Code[3]+1)>=ExtendedArraySize-1 THEN
- (* Objekt erzeugen, anschließend auf Anfangszustand *)
- DEC(Code[3]);
- Surround[0] := minx;
- Surround[1] := maxy;
- Surround[2] := maxx - minx;
- Surround[3] := maxy - miny;
- Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
- maxx := x; minx := x;
- maxy := y; miny := y;
- IF minx<MinX THEN MinX := minx; END;
- IF miny<MinY THEN MinY := miny; END;
- Code[3] := 0;
- Code[1] := x;
- Code[2] := y;
- ELSE
- IF x>maxx THEN maxx := x; END;
- IF x<minx THEN minx := x; END;
- IF y>maxy THEN maxy := y; END;
- IF y<miny THEN miny := y; END;
- IF minx<MinX THEN MinX := minx; END;
- IF miny<MinY THEN MinY := miny; END;
- Variablen.ebuffer[2*(Code[3]-1) ] := x - Code[1];
- Variablen.ebuffer[2*(Code[3]-1)+1] := y - Code[2];
- END;
- END;
- END;
- UNTIL ((x=Coord(9999)) AND (y=Coord(9999))) OR EOF;
- IF (intArray[1] = TOpenInterpol) OR
- (intArray[1] = TClosedInterpol) THEN
- anzahl := Code[3] + 1;
- REPEAT
- GetNewLine;
- WHILE (str[0]<>0C) AND (anzahl>0) DO
- cx1 := ExtractFloat(str);
- cy1 := ExtractFloat(str);
- cx2 := ExtractFloat(str);
- cy2 := ExtractFloat(str);
- DEC(anzahl);
- END;
- UNTIL (anzahl=0) OR EOF;
- END;
- IF Code[3]>0 THEN
- Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- END;
- END GetSpline;
-
- PROCEDURE GetText;
- VAR ready : BOOLEAN;
- count : INTEGER;
- BEGIN
- (* Format der Text-Beschreibung:
- %d01 %d02 %d03 %d04 %d05 %d06 %f01 %d07
- %d08 %d09 %d10 %d11 (12)
- mit
- %d01 : sub_type %d02 : font
- %d03 : font_size %d04 : pen
- %d05 : color %d06 : depth
- %f01 : angle %d07 : font_style
- %d08 : height %d09 : length
- %d10 : base_x %d11 : base_y
- Darauf folgt der Text bis entweder EOF oder aber das
- Textende-Zeichen ^A (01C) folgt. Man beachte, dass
- der Text in mehreren Zeilen stehen darf.
- *)
- ScanStr('ddddddfddddd');
- ready := FALSE;
- count := 0;
- IF str[0]<>0C THEN
- i := 0;
- WHILE (str[i]<>0C) DO
- IF str[i] = 01C THEN
- ready := TRUE;
- str[i] := 0C;
- charBuffer[count] := 0C;
- (*
- RTD.Write('Text-Line', str);
- *)
- ELSE
- IF (count<CharArraySize) THEN
- charBuffer[count] := str[i];
- INC(count);
- END;
- INC(i);
- END;
- END;
- END;
- WHILE NOT EOF AND NOT ready DO
- GetLine;
- IF (count+1<CharArraySize) THEN
- charBuffer[count] := '\';
- charBuffer[count+1] := '\';
- INC(count, 2);
- END;
- i := 0;
- WHILE str[i]<>0C DO
- IF str[i] = 01C THEN
- ready := TRUE;
- str[i] := 0C;
- charBuffer[count] := 0C;
- (*
- RTD.Write('Text-Line(s)', str);
- *)
- ELSE
- IF (count<CharArraySize) THEN
- charBuffer[count] := str[i];
- INC(count);
- END;
- INC(i);
- END;
- END;
- END;
- IF count>0 THEN
- InitCode;
- Code[0] := ORD(Framebox);
- Code[1] := Coord(intArray[10]);
- Code[2] := Coord(intArray[11]);
- Code[3] := intArray[8];
- Code[4] := intArray[9];
- Code[6] := 1; (* Flag für makebox *)
- CASE intArray[1] OF
- TLeftJustified : Code[5] := ORD(LeftBot); |
- TCenterJustified : Code[5] := ORD(Bottom); |
- TRightJustified : Code[5] := ORD(RightBot); |
- ELSE
- Code[5] := ORD(NoJust);
- END;
- Code[7] := 1;
- Code[8] := 1;
- Code[9] := count;
- Variablen.NewObject(Code, ADR(charBuffer), NIL, Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- END;
- END GetText;
-
- PROCEDURE GetCompound;
- VAR obj, last : ObjectPtrTyp;
- ready : BOOLEAN;
- BEGIN
- (* Format der Compound-Beschreibung:
- %d01 %d02 %d03 %d04 (4)
- mit
- %d01 : up_right_x %d02 : up_right_y
- %d03 : low_left_x %d04 : low_left_y
- *)
- ScanStr('dddd');
- InitCode;
- Code[0] := ORD(Picture);
- Code[1] := Coord(intArray[3]);
- Code[2] := Coord(intArray[4]);
- Surround[0] := Coord(intArray[3]);
- Surround[1] := Coord(intArray[2]);
- Surround[2] := ABS(intArray[1] - intArray[3]);
- Surround[3] := ABS(intArray[2] - intArray[4]);
- Variablen.NewObject(Code, NIL, NIL, Surround);
- Variablen.LastObject^.SurrDirty := TRUE;
- last := Variablen.LastObject;
- (* Und nun die Sache nochmals *)
- ready := FALSE;
- WHILE NOT EOF AND NOT ready DO
- GetNewLine;
- (*
- RTD.Write('str', str);
- *)
- dum := ExtractNumber(str);
- CASE dum OF
- OEllipse : (* Ellipse *) (** RTD.Message('Ellipse'); **)
- GetEllipse; |
- OPolyline : (* Polyline *) (** RTD.Message('Polyline'); **)
- GetPolyline; |
- OSpline : (* Spline *) (** RTD.Message('Spline'); **)
- GetSpline; |
- OText : (* Text *) (** RTD.Message('Text'); **)
- GetText; |
- OArc : (* Arc *) (** RTD.Message('Arc'); **)
- GetArc; |
- OCompound : (* Compound *) (** RTD.Message('Compound'); **)
- GetCompound; |
- OEndCompound : (* End of C.*) (** RTD.Message('End of C.'); **)
- ready := TRUE; |
- ELSE
- (* Unknown type *) (** RTD.Message('c-Unknown type'); **)
- END;
- END;
- IF last^.Next<>NIL THEN
- (* Korrigiere bei allen folgenden Objekten
- Koordinaten und Surround-Box... *)
- obj := last^.Next;
- WHILE obj<>NIL DO
- obj^.Code[1] := obj^.Code[1] - last^.Code[1];
- obj^.Code[2] := obj^.Code[2] - last^.Code[2];
- obj^.Surround[0] := obj^.Surround[0] - last^.Code[1];
- obj^.Surround[1] := obj^.Surround[1] - last^.Code[2];
- obj := obj^.Next;
- END;
- last^.Children := last^.Next;
- last^.Next := NIL;
- Variablen.LastObject := last;
- ELSE
- Variablen.DeleteObject(last);
- END;
- END GetCompound;
-
- BEGIN
- Reset(Filehandle, name);
- IF Filehandle >= 6 THEN
- GetLine;
- (* steht in der ersten Zeile ein "#FIG" ? *)
- pos := MagicStrings.Pos('#FIG', str);
- Close(Filehandle);
- ok := pos = 0;
- IF NOT ok THEN
- mtAlerts.SetIcon(mtAlerts.Graphic);
- (**
- i := Alert(1, NoFIGFile);
- **)
- i := NumAlert(5, 1);
- ok := i = 2;
- END;
- IF ok THEN
-
- BusyStart(name, TRUE);
-
- MinX := 0;
- MinY := 0;
-
- Reset(Filehandle, name);
- EOF := FALSE;
- Variablen.DeleteWholeTree;
- first := TRUE;
- WHILE NOT EOF DO
- GetNewLine;
- (** RTD.Write('str', str); **)
- dum := ExtractNumber(str);
- IF first THEN
- (* fig_resolution | coordinate_system *)
- pixperinch := dum;
- dum := ExtractNumber(str);
- upperleft := dum = 2;
- first := FALSE;
- ELSE
- CASE dum OF
- OEllipse : (* Ellipse *) (** RTD.Message('Ellipse'); **)
- GetEllipse; |
- OPolyline : (* Polyline *) (** RTD.Message('Polyline'); **)
- GetPolyline; |
- OSpline : (* Spline *) (** RTD.Message('Spline'); **)
- GetSpline; |
- OText : (* Text *) (** RTD.Message('Text'); **)
- GetText; |
- OArc : (* Arc *) (** RTD.Message('Arc'); **)
- GetArc; |
- OCompound : (* Compound *) (** RTD.Message('Compound'); **)
- GetCompound; |
- OEndCompound : (* End of C.*) (** RTD.Message('End of C.'); **) |
- ELSE
- (* Unknown type *) (** RTD.Message('Unknown type'); **)
- END;
- END;
- END;
- Close(Filehandle);
-
- (* Setze Auflösung auf 1/100 inch (1/80 geht nicht) *)
- Variablen.FirstObject^.Code[6] := 4 + 0100H * 3 ; (* 1/100 in *)
- Variablen.FirstObject^.Code[7] := 1; (* 1 Pixel per unit *)
- CommonData.InternalResolution := 1;
- (* Und nun zum Schluss wird die ganze Zeichnung in den
- positiven Zeichenbereich verschoben... *)
- IF (MinX<0) OR (MinY<0) THEN
- IF MinX < 0 THEN
- deltaX := -MinX;
- ELSE
- deltaX := 0;
- END;
- IF MinY < 0 THEN
- deltaY := -MinY;
- ELSE
- deltaY := 0;
- END;
- obj := Variablen.FirstObject^.Next;
- WHILE obj<>NIL DO
- obj^.Code[1] := obj^.Code[1] + deltaX;
- obj^.Code[2] := obj^.Code[2] + deltaY;
- IF NOT obj^.SurrDirty THEN
- obj^.Surround[0] := obj^.Surround[0] + deltaX;
- obj^.Surround[1] := obj^.Surround[1] + deltaY;
- END;
- obj := obj^.Next;
- END;
- END;
- BusyEnd;
- RETURN TRUE;
- END;
- RETURN FALSE;
- END;
- END ParseFile;
-
- PROCEDURE ReadIt ( ) : BOOLEAN ;
- (*
- Fragt nach Dateinamen, lädt Datei ein, versucht sie zu interpretieren,
- und die Objekte abzulegen. Unbekannte Objekte werden ignoriert.
- Die bisherigen Objekte werden gelöscht.
- *)
- VAR input, titel, msg : ARRAY [0..255] OF CHAR;
- tmp1, tmp2 : ARRAY [0..14] OF CHAR;
- res, exist : BOOLEAN;
- dum : INTEGER;
- BEGIN
- res := FALSE;
- GetFSelText(6, msg);
- tmp1 := '*.';
- tmp2 := '.';
- MagicStrings.Append(CommonData.Extensions[6], tmp1);
- MagicStrings.Append(CommonData.Extensions[6], tmp2);
- IF GetFile.GetFileName(input, titel, tmp1, tmp2,
- CommonData.FIGPath, msg,
- exist, FALSE, TRUE, TRUE, FALSE) THEN
- IF exist THEN
- MagicStrings.Assign(input, CommonData.FileName);
- GetFile.ReplaceExtension(CommonData.FileName, CommonData.Extensions[1]);
- GetFile.ReplacePath(CommonData.FileName, '');
- res := ParseFile(input);
- ELSE
- res := FALSE;
- END;
- END;
- RETURN res;
- END ReadIt;
-
- PROCEDURE WriteIt();
- VAR dum : INTEGER;
- BEGIN
- UnixLine := TRUE; (* Zeilen enden mit LF *)
- dum := NumAlert(3, 1);
- UnixLine := FALSE; (* Zeilen enden mit CR LF *)
- END WriteIt;
-
- (**
- BEGIN
- RTD.SetDevice(RTD.printer);
- **)
- END (* of implementation module *) FIG .
-